package com.androidiani.ShipDroid;
/**
 * DBManager .java
 * 
 * La classe DBManager dovr� appiopparsi tutti i compiti che serviranno a :
 * - scrivere sul database
 * - leggere sul database
 * - creare il database 
 * 
 * Oltre alle funzioni di "basso livello" dovr� essere implementata qualche funzione 
 * utile come il retrieving delle credenziali ..
 *
 * Il database potrebbe essere utilizzato anche per salvare un eventuale stato della 
 * partita (per la ripresa in futuro ) insieme alle statistiche di gioco. 
 * 
 * @author      Andrea; Alex
 * @version     0.1
 * 
 */

// Context of the application using the database.
import android.content.ContentValues;
import android.content.Context;
import android.database.*;
import android.database.sqlite.*;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

public class DBManager {
	
	// ======================================================
	// Nome del Database
	private static final String DATABASE_NAME = "shipDroid.db";
	// Nome della Tabella
	private static final String DATABASE_TABLE = "Tabella1";
	// Versione del Database
	private static final int DATABASE_VERSION = 1;
	// Chiave della tabella
	public static final String KEY_ID="_id";
	// Nome della colonna
	public static final String KEY_NAME="name"; 
	public static final int NAME_COLUMN = 1;
	// SQL Statement per la creazione del nuovo database.
	private static final String DATABASE_CREATE = "create table " +	
								DATABASE_TABLE +
								" (" + KEY_ID +
								" integer primary key autoincrement, " +
								KEY_NAME + " text not null);";
	private State state=null;
	
	public State getDbState() {
		if (db == null)
			state = null;	
		else {
			// TODO Fillare la classe State che tiene in memoria un istanza del db.. Per evitare troppe query inutili
			
			state=new State();
			
		}
		return state;
		
		
	}
	
	public boolean insertAFakeUserForTestingPurposesAndRixxoRequestThisIsATestMethodAndItsNameShouldNotUsedAgain(String username) {
		ContentValues tmp = new ContentValues();
		tmp.put(KEY_NAME, username);
		if ( db.insert(DATABASE_TABLE, "", tmp) == -1 )
			return false;
		else 
			return true;
	}
	public int readThePreviouslyInsertedFakeUser(String username){
		 Cursor tmp = null;
		 String []colonne= {KEY_ID};
		 int toret = -1;
		 tmp= db.query(DATABASE_TABLE, colonne, KEY_NAME+"='"+username+"'", null, null, null, null);
		 if (tmp.moveToFirst()) 
			 toret= tmp.getInt(0);
		 return toret;
		 
	}
	

	// Variabile per mantenere l'istanza del DB
	private SQLiteDatabase db;
	
	private final Context context;

	// Database open/upgrade helper
	private DBManagerHelper dbManagerHelper;
	
	/**
	 * Costruttore della classe
	 **/ 
	public DBManager(Context _context) throws SQLiteException {
		context = _context;
		dbManagerHelper = new DBManagerHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
		open();
	}
	
	/**
	 * Apertura connessione al DB
	 *
	 * @return: DBManager	 
	 * 
	 **/
	public DBManager open() throws SQLiteException {
		db = dbManagerHelper.getWritableDatabase();

		
		return this;
	}
	
	public void close() {
		db.close();
	}

	private static class DBManagerHelper  extends SQLiteOpenHelper {
		
		/**
		 * Costruttore dell'Helper
		 **/
		public DBManagerHelper(Context context, String name,CursorFactory factory, int version) {
			super(context, name, factory, version);
		}
		
		/**
		 * Funzione chimata in automatico per creare il DB
		 **/
		@Override
		public void onCreate(SQLiteDatabase _db) {
			_db.execSQL(DATABASE_CREATE);
		}
		
		/**
		 * Funzione per aggiornare il DB
		 **/
		@Override
		public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) {
		// Log Aggiornamento del DB.
			Log.w("TaskDBAdapter", "Aggiornamento dalla versione " + _oldVersion + " a " + _newVersion + ", cancellati tutti i dati precedenti");
		// Cancellazione vecchio DB	
			_db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
		// Creazione nuovo DB.
			onCreate(_db);
		}
	}
}